﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using SGAEntidades;
using SGABDUtil;
using SGAInterfaces;

namespace SGAAccesoDatos
{
    public class Local : ILocal
    {
        #region Miembros de ILocal

        public IList<LocalInfo> Listar(LocalInfo oLocal)
        {
            var sqlParm = new SqlParameter[8];
            var oListaLocales = new List<LocalInfo>();

            sqlParm[0] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
            if (oLocal.IdLocal != null) { sqlParm[0].Value = oLocal.IdLocal; } else { sqlParm[0].Value = DBNull.Value; }

            sqlParm[1] = new SqlParameter("@Descripcion", SqlDbType.VarChar);
            if (oLocal.Descripcion != null) { sqlParm[1].Value = oLocal.Descripcion; } else { sqlParm[1].Value = DBNull.Value; }

            sqlParm[2] = new SqlParameter("@Id_Departamento", SqlDbType.VarChar);
            if (oLocal.IdDepartamento != null) { sqlParm[2].Value = oLocal.IdDepartamento; } else { sqlParm[2].Value = DBNull.Value; }

            sqlParm[3] = new SqlParameter("@Id_Provincia", SqlDbType.VarChar);
            if (oLocal.IdProvincia != null) { sqlParm[3].Value = oLocal.IdProvincia; } else { sqlParm[3].Value = DBNull.Value; }

            sqlParm[4] = new SqlParameter("@Id_Distrito", SqlDbType.VarChar);
            if (oLocal.IdDistrito != null) { sqlParm[4].Value = oLocal.IdDistrito; } else { sqlParm[4].Value = DBNull.Value; }

            sqlParm[5] = new SqlParameter("@Id_Tipo_Local", SqlDbType.VarChar);
            if (oLocal.IdTipoLocal != null) { sqlParm[5].Value = oLocal.IdTipoLocal; } else { sqlParm[5].Value = DBNull.Value; }

            sqlParm[6] = new SqlParameter("@Id_Tipo_Propiedad", SqlDbType.VarChar);
            if (oLocal.IdTipoPropiedad != null) { sqlParm[6].Value = oLocal.IdTipoPropiedad; } else { sqlParm[6].Value = DBNull.Value; }

            sqlParm[7] = new SqlParameter("@Id_Estado_Local", SqlDbType.VarChar);
            if (oLocal.IdEstadoLocal != null) { sqlParm[7].Value = oLocal.IdEstadoLocal; } else { sqlParm[7].Value = DBNull.Value; }

            using (var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction, CommandType.StoredProcedure, "SGA_SP_CONSULTAR_LOCAL", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaLocales.Add(new LocalInfo(drd.GetString(0).Trim(), drd.GetString(1).Trim(), drd.GetString(2).Trim(),
                                drd.GetString(3).Trim(), new UbigeoInfo(drd.GetString(3), null, null, drd.GetString(4).Trim()),
                                drd.GetString(5).Trim(), new UbigeoInfo(null, drd.GetString(5), null, drd.GetString(6).Trim()),
                                drd.GetString(7).Trim(), new UbigeoInfo(null, null, drd.GetString(7).Trim(), drd.GetString(8).Trim()),
                                drd.IsDBNull(15) ? (DateTime?)null : drd.GetDateTime(15),
                                drd.IsDBNull(16) ? (DateTime?)null : drd.GetDateTime(16),
                                drd.GetString(17).Trim(),
                                drd.GetString(18).Trim(), drd.GetString(21).Trim(), drd.GetString(22).Trim(), drd.GetString(23).Trim(),
                                drd.GetString(9).Trim(), new TipoLocalInfo(drd.GetString(9).Trim(), drd.GetString(10)),
                                drd.GetString(11).Trim(), new TipoPropiedadInfo(drd.GetString(11).Trim(), drd.GetString(12).Trim()),
                                drd.GetString(13).Trim(), new EstadoLocalInfo(drd.GetString(13).Trim(), drd.GetString(14).Trim()),
                                drd.GetString(19).Trim(), new TipoContactoInfo(drd.GetString(19).Trim(), drd.GetString(20).Trim()), null));
                        }
                    }
                }
            }
            return oListaLocales;
        }

        public LocalInfo Consultar(LocalInfo oLocal)
        {
            var sqlParm = new SqlParameter[8];
            var oEntLocal = new LocalInfo();

            sqlParm[0] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
            if (oLocal.IdLocal != null) { sqlParm[0].Value = oLocal.IdLocal; } else { sqlParm[0].Value = DBNull.Value; }

            sqlParm[1] = new SqlParameter("@Descripcion", SqlDbType.VarChar);
            if (oLocal.Descripcion != null) { sqlParm[1].Value = oLocal.Descripcion; } else { sqlParm[1].Value = DBNull.Value; }

            sqlParm[2] = new SqlParameter("@Id_Departamento", SqlDbType.VarChar);
            if (oLocal.IdDepartamento != null) { sqlParm[2].Value = oLocal.IdDepartamento; } else { sqlParm[2].Value = DBNull.Value; }

            sqlParm[3] = new SqlParameter("@Id_Provincia", SqlDbType.VarChar);
            if (oLocal.IdProvincia != null) { sqlParm[3].Value = oLocal.IdProvincia; } else { sqlParm[3].Value = DBNull.Value; }

            sqlParm[4] = new SqlParameter("@Id_Distrito", SqlDbType.VarChar);
            if (oLocal.IdDistrito != null) { sqlParm[4].Value = oLocal.IdDistrito; } else { sqlParm[4].Value = DBNull.Value; }

            sqlParm[5] = new SqlParameter("@Id_Tipo_Local", SqlDbType.VarChar);
            if (oLocal.IdTipoLocal != null) { sqlParm[5].Value = oLocal.IdTipoLocal; } else { sqlParm[5].Value = DBNull.Value; }

            sqlParm[6] = new SqlParameter("@Id_Tipo_Propiedad", SqlDbType.VarChar);
            if (oLocal.IdTipoPropiedad != null) { sqlParm[6].Value = oLocal.IdTipoPropiedad; } else { sqlParm[6].Value = DBNull.Value; }

            sqlParm[7] = new SqlParameter("@Id_Estado_Local", SqlDbType.VarChar);
            if (oLocal.IdEstadoLocal != null) { sqlParm[7].Value = oLocal.IdEstadoLocal; } else { sqlParm[7].Value = DBNull.Value; }

            using (var drd = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringDistributedTransaction, CommandType.StoredProcedure, "SGA_SP_CONSULTAR_LOCAL", sqlParm))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        drd.Read();
                        oEntLocal = new LocalInfo(drd.GetString(0).Trim(), drd.GetString(1).Trim(), drd.GetString(2).Trim(),
                            drd.GetString(3).Trim(), new UbigeoInfo(drd.GetString(3), null, null, drd.GetString(4).Trim()),
                            drd.GetString(5).Trim(), new UbigeoInfo(null, drd.GetString(5), null, drd.GetString(6).Trim()),
                            drd.GetString(7).Trim(), new UbigeoInfo(null, null, drd.GetString(7).Trim(), drd.GetString(8).Trim()),
                            drd.IsDBNull(15) ? (DateTime?)null : drd.GetDateTime(15),
                            drd.IsDBNull(16) ? (DateTime?)null : drd.GetDateTime(16),
                            drd.GetString(17).Trim(),
                            drd.GetString(18).Trim(), drd.GetString(21).Trim(), drd.GetString(22).Trim(), drd.GetString(23).Trim(),
                            drd.GetString(9).Trim(), new TipoLocalInfo(drd.GetString(9).Trim(), drd.GetString(10)),
                            drd.GetString(11).Trim(), new TipoPropiedadInfo(drd.GetString(11).Trim(), drd.GetString(12).Trim()),
                            drd.GetString(13).Trim(), new EstadoLocalInfo(drd.GetString(13).Trim(), drd.GetString(14).Trim()),
                            drd.GetString(19).Trim(), new TipoContactoInfo(drd.GetString(19).Trim(), drd.GetString(20).Trim()), null);

                    }
                }
            }
            return oEntLocal;
        }

        public bool Registrar(LocalInfo oLocal, ref String sIdLocal)
        {
            var sqlParm = new SqlParameter[18];
            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Descripcion", SqlDbType.VarChar);
                    if (oLocal.Descripcion != null) { sqlParm[0].Value = oLocal.Descripcion; } else { sqlParm[0].Value = DBNull.Value; }

                    sqlParm[1] = new SqlParameter("@Direccion", SqlDbType.VarChar);
                    if (oLocal.Direccion != null) { sqlParm[1].Value = oLocal.Direccion; } else { sqlParm[1].Value = DBNull.Value; }

                    sqlParm[2] = new SqlParameter("@Id_Departamento", SqlDbType.VarChar);
                    if (oLocal.IdDepartamento != null) { sqlParm[2].Value = oLocal.IdDepartamento; } else { sqlParm[2].Value = DBNull.Value; }

                    sqlParm[3] = new SqlParameter("@Id_Provincia", SqlDbType.VarChar);
                    if (oLocal.IdProvincia != null) { sqlParm[3].Value = oLocal.IdProvincia; } else { sqlParm[3].Value = DBNull.Value; }

                    sqlParm[4] = new SqlParameter("@Id_Distrito", SqlDbType.VarChar);
                    if (oLocal.IdDistrito != null) { sqlParm[4].Value = oLocal.IdDistrito; } else { sqlParm[4].Value = DBNull.Value; }

                    sqlParm[5] = new SqlParameter("@Id_Tipo_Local", SqlDbType.VarChar);
                    if (oLocal.IdTipoLocal != null) { sqlParm[5].Value = oLocal.IdTipoLocal; } else { sqlParm[5].Value = DBNull.Value; }

                    sqlParm[6] = new SqlParameter("@Id_Tipo_Propiedad", SqlDbType.VarChar);
                    if (oLocal.IdTipoPropiedad != null) { sqlParm[6].Value = oLocal.IdTipoPropiedad; } else { sqlParm[6].Value = DBNull.Value; }

                    sqlParm[7] = new SqlParameter("@Id_Estado_Local", SqlDbType.VarChar);
                    if (oLocal.IdEstadoLocal != null) { sqlParm[7].Value = oLocal.IdEstadoLocal; } else { sqlParm[7].Value = DBNull.Value; }

                    sqlParm[8] = new SqlParameter("@Fecha_Inicio_Operacion", SqlDbType.DateTime);
                    if (oLocal.FechaInicio.HasValue) { sqlParm[8].Value = oLocal.FechaInicio; } else { sqlParm[8].Value = DBNull.Value; }

                    sqlParm[9] = new SqlParameter("@Fecha_Fin_Operacion", SqlDbType.DateTime);
                    if (oLocal.FechaFin.HasValue) { sqlParm[9].Value = oLocal.FechaFin; } else { sqlParm[9].Value = DBNull.Value; }

                    sqlParm[10] = new SqlParameter("@Locatario", SqlDbType.VarChar);
                    if (oLocal.Locatario != null) { sqlParm[10].Value = oLocal.Locatario; } else { sqlParm[10].Value = DBNull.Value; }

                    sqlParm[11] = new SqlParameter("@Nombre_Contacto", SqlDbType.VarChar);
                    if (oLocal.NombreContacto != null) { sqlParm[11].Value = oLocal.NombreContacto; } else { sqlParm[11].Value = DBNull.Value; }

                    sqlParm[12] = new SqlParameter("@Id_Tipo_Contacto", SqlDbType.VarChar);
                    if (oLocal.IdTipoContacto != null) { sqlParm[12].Value = oLocal.IdTipoContacto; } else { sqlParm[12].Value = DBNull.Value; }

                    sqlParm[13] = new SqlParameter("@Telefono_Contacto", SqlDbType.VarChar);
                    if (oLocal.TelefonoContacto != null) { sqlParm[13].Value = oLocal.TelefonoContacto; } else { sqlParm[13].Value = DBNull.Value; }

                    sqlParm[14] = new SqlParameter("@Celular_Contacto", SqlDbType.VarChar);
                    if (oLocal.CelularContacto != null) { sqlParm[14].Value = oLocal.CelularContacto; } else { sqlParm[14].Value = DBNull.Value; }

                    sqlParm[15] = new SqlParameter("@Correo_Contacto", SqlDbType.VarChar);
                    if (oLocal.CorreoContacto != null) { sqlParm[15].Value = oLocal.CorreoContacto; } else { sqlParm[15].Value = DBNull.Value; }

                    sqlParm[16] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oLocal.UsuarioSistema != null) { sqlParm[16].Value = oLocal.UsuarioSistema; } else { sqlParm[16].Value = DBNull.Value; }

                    sqlParm[17] = new SqlParameter("@Id", SqlDbType.VarChar, 5) { Direction = ParameterDirection.Output };

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_REGISTRAR_LOCAL", sqlParm);
                    sIdLocal = sqlParm[17].Value.ToString();
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
            }
            return true;
        }

        public bool Actualizar(LocalInfo oLocal)
        {
            var sqlParm = new SqlParameter[18];
            using (var con = new SqlConnection(SqlHelper.ConnectionStringDistributedTransaction))
            {
                con.Open();
                var trx = con.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    sqlParm[0] = new SqlParameter("@Id_Local", SqlDbType.VarChar);
                    if (oLocal.IdLocal != null) { sqlParm[0].Value = oLocal.IdLocal; } else { sqlParm[0].Value = DBNull.Value; }

                    sqlParm[1] = new SqlParameter("@Descripcion", SqlDbType.VarChar);
                    if (oLocal.Descripcion != null) { sqlParm[1].Value = oLocal.Descripcion; } else { sqlParm[1].Value = DBNull.Value; }

                    sqlParm[2] = new SqlParameter("@Direccion", SqlDbType.VarChar);
                    if (oLocal.Direccion != null) { sqlParm[2].Value = oLocal.Direccion; } else { sqlParm[2].Value = DBNull.Value; }

                    sqlParm[3] = new SqlParameter("@Id_Departamento", SqlDbType.VarChar);
                    if (oLocal.IdDepartamento != null) { sqlParm[3].Value = oLocal.IdDepartamento; } else { sqlParm[3].Value = DBNull.Value; }

                    sqlParm[4] = new SqlParameter("@Id_Provincia", SqlDbType.VarChar);
                    if (oLocal.IdProvincia != null) { sqlParm[4].Value = oLocal.IdProvincia; } else { sqlParm[4].Value = DBNull.Value; }

                    sqlParm[5] = new SqlParameter("@Id_Distrito", SqlDbType.VarChar);
                    if (oLocal.IdDistrito != null) { sqlParm[5].Value = oLocal.IdDistrito; } else { sqlParm[5].Value = DBNull.Value; }

                    sqlParm[6] = new SqlParameter("@Id_Tipo_Local", SqlDbType.VarChar);
                    if (oLocal.IdTipoLocal != null) { sqlParm[6].Value = oLocal.IdTipoLocal; } else { sqlParm[6].Value = DBNull.Value; }

                    sqlParm[7] = new SqlParameter("@Id_Tipo_Propiedad", SqlDbType.VarChar);
                    if (oLocal.IdTipoPropiedad != null) { sqlParm[7].Value = oLocal.IdTipoPropiedad; } else { sqlParm[7].Value = DBNull.Value; }

                    sqlParm[8] = new SqlParameter("@Id_Estado_Local", SqlDbType.VarChar);
                    if (oLocal.IdEstadoLocal != null) { sqlParm[8].Value = oLocal.IdEstadoLocal; } else { sqlParm[8].Value = DBNull.Value; }

                    sqlParm[9] = new SqlParameter("@Fecha_Inicio_Operacion", SqlDbType.DateTime);
                    if (oLocal.FechaInicio.HasValue) { sqlParm[9].Value = oLocal.FechaInicio; } else { sqlParm[9].Value = DBNull.Value; }

                    sqlParm[10] = new SqlParameter("@Fecha_Fin_Operacion", SqlDbType.DateTime);
                    if (oLocal.FechaFin.HasValue) { sqlParm[10].Value = oLocal.FechaFin; } else { sqlParm[10].Value = DBNull.Value; }

                    sqlParm[11] = new SqlParameter("@Locatario", SqlDbType.VarChar);
                    if (oLocal.Locatario != null) { sqlParm[11].Value = oLocal.Locatario; } else { sqlParm[11].Value = DBNull.Value; }

                    sqlParm[12] = new SqlParameter("@Nombre_Contacto", SqlDbType.VarChar);
                    if (oLocal.NombreContacto != null) { sqlParm[12].Value = oLocal.NombreContacto; } else { sqlParm[12].Value = DBNull.Value; }

                    sqlParm[13] = new SqlParameter("@Id_Tipo_Contacto", SqlDbType.VarChar);
                    if (oLocal.IdTipoContacto != null) { sqlParm[13].Value = oLocal.IdTipoContacto; } else { sqlParm[13].Value = DBNull.Value; }

                    sqlParm[14] = new SqlParameter("@Telefono_Contacto", SqlDbType.VarChar);
                    if (oLocal.TelefonoContacto != null) { sqlParm[14].Value = oLocal.TelefonoContacto; } else { sqlParm[14].Value = DBNull.Value; }

                    sqlParm[15] = new SqlParameter("@Celular_Contacto", SqlDbType.VarChar);
                    if (oLocal.CelularContacto != null) { sqlParm[15].Value = oLocal.CelularContacto; } else { sqlParm[15].Value = DBNull.Value; }

                    sqlParm[16] = new SqlParameter("@Correo_Contacto", SqlDbType.VarChar);
                    if (oLocal.CorreoContacto != null) { sqlParm[16].Value = oLocal.CorreoContacto; } else { sqlParm[16].Value = DBNull.Value; }

                    sqlParm[17] = new SqlParameter("@Usuario_Sistema", SqlDbType.VarChar);
                    if (oLocal.UsuarioSistema != null) { sqlParm[17].Value = oLocal.UsuarioSistema; } else { sqlParm[17].Value = DBNull.Value; }

                    SqlHelper.ExecuteNonQuery(trx, CommandType.StoredProcedure, "SGA_SP_ACTUALIZAR_LOCAL", sqlParm);
                    trx.Commit();
                }
                catch (Exception)
                {
                    trx.Rollback();
                    return false;
                }
                finally
                {
                    con.Close();
                }
                return true;
            }
        }
        #endregion
    }
}
